package edu.object_oriented.innerClass;

import edu.object_oriented.extendPrra.Tea;

/**
 * 内部类 ：
 * 成员内部类 ： 和外部类一样，可以定义自己的属性以及方法
 * 还可以使用外部类中的属性以及方法
 * 使用和成员变量、方法一样，需要通过外部类对象进行调用
 * 静态内部类 :
 *       相当于外部类的静态属性或静态方法    内部具有类的常规特性
 *      使用： 按照常规类直接实例化使用即可
 * 局部内部类 ：在 {}  方法 、构造代码块....中定义的内部类  只能在自己的局部被使用
 *          不能定义静态属性
 * 匿名内部类：
 *          一般结合抽象类或接口使用，而且只能被使用一次
 */
public class Demo {

    String msg;

    void methodA() {
        System.out.println(msg);
        class InnerPart {
            String a;

            void partMethod() {
                System.out.println("局部内部类的执行");
            }
        }
        //只能在自己的范围内局部调用
        new InnerPart().partMethod();
    }

    //类 位于  Demo的内部    成员内部类
    class InnerMember {
        String message;

        void testInnerMethod() {
            System.out.println("成员内部类的方法执行" + message + msg);
            methodA();
//            InnerStatic innerStatic = new InnerStatic();
        }
    }

    //静态内部类
    static class InnerStatic {
        String message;

        void testInnerStatic() {
            System.out.println("成员内部类的方法执行" + message);
        }
    }

    //局部内部类
    public static void main(String[] args) {
        Demo demo = new Demo();
        demo.msg = "外部类信息";
        demo.methodA();
        InnerMember member = demo.new InnerMember();
        member.message = "成员内部类的信息";
        member.testInnerMethod();
        System.out.println("//////////////////////////////");
        //静态内部类可以直接实例化使用
        InnerStatic innerStatic = new InnerStatic();
        innerStatic.message = "静态内部类的属性";
        innerStatic.testInnerStatic();
    }
}

class Test {

    public static void main(String[] args) {
        //测试静态内部类的实例化   new  外部类.静态内部类名();
        Demo.InnerStatic innerStatic = new Demo.InnerStatic();
        Demo demo = new Demo();
        demo.methodA();
        //匿名内部类    实例化 接口或抽象类时，利用{}去实现抽象方法，
        // 此时内存中相当于帮助创建了一个实现类
        UserDao userDao = new UserDao() {
            @Override
            public void findUser() {
                System.out.println("查询所用的用户信息");
            }
        };
        userDao.findUser();

        UserDao dao = new UserDao() {
            @Override
            public void findUser() {
                System.out.println("查询一个");
            }
        };
    }
}

interface UserDao{
    void findUser();
}


